package com.encrypt;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

/**
 * @author zhangyan
 * @version $ Id: DESDemo.java, v 0.1 2022/1/13 22:53 zhangyan Exp $
 */
public class DESDemo {
    public static void main(String[] args) throws Exception {
        //加密的值des加密模式使用CBC，填充选择PKCS5Padding
        String value = "硅谷";
        // transformation:参数表示使用什么类型加密
        String transformation = "PKCS5Padding";
        // Cipher：密码，获取加密对象
        Cipher cipher = Cipher.getInstance(transformation);
        // des加密必须是8位 String key = "12345678";
        String secretKey = "026F298F";
        //偏移量
        String iv = "05CBEB03";
        // 算法
        String algorithm = "CBC";
        // 指定秘钥规则
        // key，密钥
        // 第二个参数表示：算法
        SecretKeySpec sks = new SecretKeySpec(secretKey.getBytes(), algorithm);
        // 对加密进行初始化
        // 第一个参数：表示模式，有加密模式和解密模式
        // 第二个参数：表示秘钥规则
        cipher.init(Cipher.ENCRYPT_MODE, sks);
        // 进行加密
        byte[] bytes = cipher.doFinal(value.getBytes());
        // 打印字节，因为ascii码有负数，解析不出来，所以乱码
//        for (byte b : bytes) {
//            System.out.println(b);
//        }
        // 打印密文
        String s = Base64.encodeBase64String(bytes);
        System.out.println(s);
        //解密
        byte[] cipherTextByte = Base64.decodeBase64(s.getBytes(StandardCharsets.UTF_8));
        cipher.init(Cipher.DECRYPT_MODE, sks);
        bytes = cipher.doFinal(cipherTextByte);
        System.out.println(new String(bytes));
    }
}
